package com.guqj.basis.innerclass;

import org.junit.Test;

/**
 * 编译后会生成两个类，一个是StaticOuter, 一个StaticOuter$Inner
 * 
 * public class StaticOuter{
 *    private static int shared = 100;
 *    
 *    public void test(){
        StaticOuter$Inner si = new StaticOuter$Inner();
        si.innerMethod();
      }
    
    static int access$0(){
        return shared;
    }
 * }
 * 
 * public class StaticOuter$Inner{
 *   public void innerMethod() {
 *     System.out.println("inner " + StaticOuter.access$0());
 *   }
 * }
 * @author guqj
 * @date   2017年3月30日
 */
public class StaticOuter {

	/**
	 * JVM会生成一个非私有方法
	 * 
	 * static int access$0(){
	 *   return shared;
	 * }
	 * 
	 */
	private static int shared = 100; 

	/**
	 * <pre>
	 * 	  静态内部类可以有静态变量、静态方法、成员方法、成员变量、构造方法等,
	 *   但不可以访问外部类的实例变量和方法, 静态内部类可以访问外部类的私有变量shared，是因为JVM会生成一个非私有方法。
	 * </pre>
	 */
	public static class Inner {
		public void innerMethod() {
			System.out.println("inner " + shared);
		}
	}
	
	
	@Test
	public void test(){
		Inner inner = new Inner(); // equal Outer.Inner inner = new Outer.Inner()
		inner.innerMethod();
	}
}
